import { StatusCodes } from 'http-status-codes';
import { verifyToken, getTokenFromHeader } from '../utils/jwt.js';
import logger from '../config/logger.js';
import db from '../models/index.js';

const { User } = db;

/**
 * 保护路由 - 验证用户是否已登录
 */
export const protect = async (req, res, next) => {
  try {
    // 1) 获取令牌
    const token = getTokenFromHeader(req);

    if (!token) {
      return res.status(StatusCodes.UNAUTHORIZED).json({
        success: false,
        message: '您尚未登录，请先登录',
      });
    }

    // 2) 验证令牌
    const decoded = verifyToken(token);

    // 3) 检查用户是否仍然存在
    const user = await User.findByPk(decoded.id);
    if (!user) {
      return res.status(StatusCodes.UNAUTHORIZED).json({
        success: false,
        message: '用户不存在或已被删除',
      });
    }

    // 4) 将用户信息添加到请求对象中
    req.user = user;
    next();
  } catch (error) {
    logger.error('认证中间件错误:', error);
    return res.status(StatusCodes.UNAUTHORIZED).json({
      success: false,
      message: '登录已过期，请重新登录',
    });
  }
};

/**
 * 限制特定角色访问
 * @param {...string} roles - 允许访问的角色
 * @returns {Function} Express中间件函数
 */
export const restrictTo = (...roles) => {
  return (req, res, next) => {
    if (!roles.includes(req.user.role)) {
      return res.status(StatusCodes.FORBIDDEN).json({
        success: false,
        message: '您没有执行此操作的权限',
      });
    }
    next();
  };
};

/**
 * 检查用户是否已登录（可选中间件）
 */
export const optionalAuth = async (req, res, next) => {
  try {
    const token = getTokenFromHeader(req);
    
    if (token) {
      const decoded = verifyToken(token);
      const user = await User.findByPk(decoded.id);
      
      if (user) {
        req.user = user;
      }
    }
    
    next();
  } catch (error) {
    // 如果令牌无效，继续执行但不设置req.user
    next();
  }
};
